/**
 * **************************************************************************
 *
 * @说明: 
 * @项目名称: talent-aio-examples-server
 *
 * @author: tanyaowu 
 * @创建时间: 2016年11月18日 上午9:13:15
 *
 * **************************************************************************
 */
package cn.skynethome.redisx.common;

import org.apache.log4j.Logger;

import com.talent.aio.client.intf.ClientAioHandler;
import com.talent.aio.common.ChannelContext;

import cn.skynethome.redisx.j2cache.Cache;
import cn.skynethome.redisx.spring.RedisX;

/**
 * 
 * @author tanyaowu 
 * @创建时间 2016年11月18日 上午9:13:15
 *
 * @操作列表
 *  编号	| 操作时间	| 操作人员	 | 操作说明
 *  (1) | 2016年11月18日 | tanyaowu | 新建类
 *
 */
public class RedisXSharedSentinelAioHandler extends RedisxAbsAioHandler implements ClientAioHandler<Object, RedisxPacket, Object>
{
    
    private Logger logger = Logger.getLogger(RedisX.class);

    public Cache redisXCache;
    
    public RedisXSharedSentinelAioHandler(Cache redisXCache)
    {
        super();
        this.redisXCache = redisXCache;
    }
    
    public RedisXSharedSentinelAioHandler()
    {
        super();
    }
    
	/** 
	 * 处理消息
	 */
	@Override
	public Object handler(RedisxPacket packet, ChannelContext<Object, RedisxPacket, Object> channelContext) throws Exception
	{
		byte[] body = packet.getBody();
		if (body != null)
		{
		    RedisXCacheBean redisXCacheBean = (RedisXCacheBean)SerializationAndCompressUtils.fastDeserialize(body);
		    
		    if("PUT".equals(redisXCacheBean.getOption()))
		    {
		        logger.info("recevie a cmmand,put action,save key {"+redisXCacheBean.getKey()+"} from local ehcache.");
		        redisXCache.put(redisXCacheBean, redisXCacheBean.getObj());
		        
		    }else if("DEL".equals(redisXCacheBean.getOption()))
		    {
		        logger.info("recevie a cmmand,del action,del  key {"+redisXCacheBean.getKey()+"} from local ehcache.");
		        redisXCache.evict(redisXCacheBean.getKey());
		    }
		}

		return null;
	}

	private static RedisxPacket heartbeatPacket = new RedisxPacket();

	/** 
	 * 此方法如果返回null，框架层面则不会发心跳；如果返回非null，框架层面会定时发本方法返回的消息包
	 */
	@Override
	public RedisxPacket heartbeatPacket()
	{
		return heartbeatPacket;
	}
}
